Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Observer pattern</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Observer_pattern"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Observer_pattern rootpage-Observer_pattern skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Observer pattern</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<p>In <a href="Software_design" title="Software design">software design</a> and <a href="Software_engineering" title="Software engineering">software engineering</a>, the <b>observer pattern</b> is a <a href="Software_design_pattern" title="Software design pattern">software design pattern</a> in which an object, called the <i><b>subject</b></i> (also known as <i><b>event source</b></i> or <i><b>event stream</b></i>), maintains a list of its dependents, called <b>observers</b> (also known as <i><b>event sinks</b></i>), and automatically notifies them of any <a href="State_(computer_science)" title="State (computer science)">state changes</a>, typically by calling one of their <a href="Method_(computer_science)" class="mw-redirect" title="Method (computer science)">methods</a>. The subject knows its observers through a standardized interface and manages the subscription list directly.
</p><p>This pattern creates a one-to-many dependency where multiple observers can listen to a single subject, but the coupling is typically synchronous and direct—the subject calls observer methods when changes occur, though asynchronous implementations using event queues are possible. Unlike the <a href="Publish-subscribe_pattern" class="mw-redirect" title="Publish-subscribe pattern">publish-subscribe pattern</a>, there is no intermediary broker; the subject and observers have direct references to each other.
</p><p>It is commonly used to implement <a href="Event_handling" class="mw-redirect" title="Event handling">event handling</a> systems in <a href="Event-driven_programming" title="Event-driven programming">event-driven programming</a>, particularly in-process systems like GUI toolkits or MVC frameworks. This makes the pattern well-suited to processing data that arrives unpredictably—such as <a href="User_input" class="mw-redirect" title="User input">user input</a>, <a href="HTTP_request" class="mw-redirect" title="HTTP request">HTTP requests</a>, <a href="General-purpose_input/output" title="General-purpose input/output">GPIO</a> signals, updates from <a href="Distributed_database" title="Distributed database">distributed databases</a>, or changes in a <a href="Graphical_user_interface" title="Graphical user interface">GUI</a> model.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Overview">Overview</h2></div>
<p>The observer design pattern is a behavioural pattern listed among the 23 well-known <a href="Design_Patterns" title="Design Patterns">"Gang of Four" design patterns</a> that address recurring design challenges in order to design flexible and reusable object-oriented software, yielding objects that are easier to implement, change, test, and reuse.<sup id="cite_ref-GoF_1-0" class="reference"><a href="#cite_note-GoF-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p><p>The observer pattern addresses the following requirements:<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<ul><li>A one-to-many dependency between objects should be defined without making the objects tightly coupled.</li>
<li>When one object changes state, an open-ended number of dependent objects should be updated automatically.</li>
<li>An object can notify multiple other objects.</li></ul>
<p>The naive approach would be for one object (subject) to directly call specific methods on each dependent object. This creates tight coupling because the subject must know the concrete types and specific interfaces of all dependent objects, making the code inflexible and hard to extend. However, this direct approach may be preferable in performance-critical scenarios (such as low-level kernel structures or real-time systems) where the overhead of abstraction is unacceptable and compile-time optimization is crucial.
</p><p>The observer pattern provides a more flexible alternative by establishing a standard notification protocol:
</p>
<ol><li>Define <code>Subject</code> and <code>Observer</code> objects with standardized interfaces.</li>
<li>When a subject changes state, all registered observers are notified and updated automatically.</li>
<li>The subject manages its own state while also maintaining a list of observers and notifying them of state changes by calling their <code>update()</code> operation.</li>
<li>The responsibility of observers is to register and unregister themselves with a subject (in order to be notified of state changes) and to update their state (to synchronize it with the subject's state) when they are notified.</li></ol>
<p>This approach makes subject and observers loosely coupled through interface standardization. The subject only needs to know that observers implement the <code>update()</code> method—it has no knowledge of observers' concrete types or internal implementation details. Observers can be added and removed independently at run time.
</p>
<div class="mw-heading mw-heading2"><h2 id="Relationship_to_publish–subscribe">Relationship to publish–subscribe</h2></div>
<p>The observer pattern and the <a href="Publish%E2%80%93subscribe_pattern" title="Publish–subscribe pattern">publish–subscribe pattern</a> are closely related and often confused, as both support one-to-many communication between components. However, they differ significantly in architecture, degree of coupling, and common use cases.
</p><p>The table below summarizes the key differences:
</p>
<table class="wikitable">
<tbody><tr>
<th>Feature
</th>
<th><b>Observer Pattern</b>
</th>
<th><b>Publish–Subscribe Pattern</b>
</th></tr>
<tr>
<td><b>Coupling</b>
</td>
<td><i>Tightly coupled</i> — the subject holds direct references to its observers via a standardized interface.
</td>
<td><i>Loosely coupled</i> — publishers and subscribers are unaware of each other.
</td></tr>
<tr>
<td><b>Communication</b>
</td>
<td><i>Direct</i> — the subject calls observer methods, typically synchronously.
</td>
<td><i>Indirect</i> — a broker (message bus or event manager) dispatches messages to subscribers.
</td></tr>
<tr>
<td><b>Knowledge of Participants</b>
</td>
<td>The subject knows its observers.
</td>
<td>Publisher and subscriber are decoupled; neither knows about the other.
</td></tr>
<tr>
<td><b>Scalability</b>
</td>
<td>Suitable for in-process systems like GUI toolkits.
</td>
<td>More scalable; supports distributed systems and asynchronous messaging.
</td></tr>
<tr>
<td><b>Synchronous or Asynchronous</b>
</td>
<td>Typically synchronous but can be asynchronous with event queues.
</td>
<td>Typically asynchronous but can be synchronous.
</td></tr>
<tr>
<td><b>Filtering</b>
</td>
<td>Limited — observers receive all events and filter internally.
</td>
<td>Rich filtering — brokers may filter by topic, content, or rules.
</td></tr>
<tr>
<td><b>Fault Tolerance</b>
</td>
<td>Observer failures can affect the subject.
</td>
<td>Failures are isolated; the broker decouples participants.
</td></tr>
<tr>
<td><b>Typical Usage</b>
</td>
<td>GUI frameworks, MVC architecture, local object notifications.
</td>
<td>Microservices, distributed systems, messaging middleware.
</td></tr></tbody></table>
<p>In practice, publish–subscribe systems evolved to address several limitations of the observer pattern. A typical observer implementation creates a tight coupling between the subject and its observers. This may limit scalability, flexibility, and maintainability, especially in distributed environments. Subjects and observers must conform to a shared interface, and both parties are aware of each other’s presence.
</p><p>To reduce this coupling, publish–subscribe systems introduce a message broker or event bus that intermediates between publishers and subscribers. This additional layer removes the need for direct references, allowing systems to evolve independently. Brokers may also support features like message persistence, delivery guarantees, topic-based filtering, and asynchronous communication.
</p><p>In some systems, the observer pattern is used internally to implement subscription mechanisms behind a publish–subscribe interface. In other cases, the patterns are applied independently. For example, <a href="JavaScript" title="JavaScript">JavaScript</a> libraries and frameworks often offer both observer-like subscriptions (e.g., via callback registration) and decoupled pub-sub mechanisms (e.g., via event emitters or signals).<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p><p>Historically, in early graphical operating systems like <a href="OS/2" title="OS/2">OS/2</a> and <a href="Microsoft_Windows" title="Microsoft Windows">Microsoft Windows</a>, the terms "publish–subscribe" and "event-driven programming" were often used as synonyms for the observer pattern.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p><p>The observer pattern, as formalized in <i>Design Patterns</i>,<sup id="cite_ref-GoF_1-1" class="reference"><a href="#cite_note-GoF-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> deliberately omits concerns such as unsubscription, notification filtering, delivery guarantees, and message logging. These advanced capabilities are typically implemented in robust message queuing systems, where the observer pattern may serve as a foundational mechanism but is not sufficient by itself.
</p><p>Related patterns include <a href="Mediator_pattern" title="Mediator pattern">mediator</a> and <a href="Singleton_pattern" title="Singleton pattern">singleton</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Limitations_and_solutions">Limitations and solutions</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Strong_vs._weak_references">Strong vs. weak references</h3></div>
<p>A common drawback of the observer pattern is the potential for <a href="Memory_leak" title="Memory leak">memory leaks</a>, known as the <a href="Lapsed_listener_problem" title="Lapsed listener problem">lapsed listener problem</a>. This occurs when a subject maintains strong references to its observers, preventing them from being <a href="Garbage_collection_(computer_science)" title="Garbage collection (computer science)">garbage collected</a> even if they are no longer needed elsewhere. Because the pattern typically requires both explicit registration and deregistration (as in the <a href="Dispose_pattern" title="Dispose pattern">dispose pattern</a>), forgetting to unregister observers can leave dangling references. This issue can be mitigated by using <a href="Weak_reference" title="Weak reference">weak references</a> for observer references, allowing the garbage collector to reclaim observer objects that are no longer in use.
</p>
<div class="mw-heading mw-heading3"><h3 id="Throttling_and_temporal_decoupling">Throttling and temporal decoupling</h3></div>
<p>In some applications, particularly user interfaces, the subject's state may change so frequently that notifying observers on every change is inefficient or counterproductive. For example, a view that re-renders on every minor change in a data model might become unresponsive or flicker.
</p><p>In such cases, the observer pattern can be modified to decouple notifications <i>temporally</i> by introducing a throttling mechanism, such as a timer. Rather than updating on every state change, the observer polls the subject or is notified at regular intervals, rendering an approximate but stable view of the model.
</p><p>This approach is commonly used for elements like <a href="Progress_bar" title="Progress bar">progress bars</a>, where the underlying process changes state rapidly. Instead of responding to every minor increment, the observer updates the visual display periodically, improving performance and usability.
</p><p>This form of temporal decoupling allows observers to remain responsive without being overwhelmed by high-frequency updates, while still reflecting the overall trend or progress of the subject’s state.
</p>
<div class="mw-heading mw-heading2"><h2 id="Structure">Structure</h2></div>
<div class="mw-heading mw-heading3"><h3 id="UML_class_and_sequence_diagram">UML class and sequence diagram</h3></div>

<p>In this <a href="Unified_Modeling_Language" title="Unified Modeling Language">UML</a> <a href="Class_diagram" title="Class diagram">class diagram</a>, the <code>Subject</code> class does not update the state of dependent objects directly. Instead, <code>Subject</code> refers to the <code>Observer</code> interface (<code>update()</code>) for updating state, which makes the <code>Subject</code> independent of how the state of dependent objects is updated. The <code>Observer1</code> and <code>Observer2</code> classes implement the <code>Observer</code> interface by synchronizing their state with subject's state.
</p><p>The <a href="Unified_Modeling_Language" title="Unified Modeling Language">UML</a> <a href="Sequence_diagram" title="Sequence diagram">sequence diagram</a> shows the runtime interactions: The <code>Observer1</code> and <code>Observer2</code> objects call <code>attach(this)</code> on <code>Subject1</code> to register themselves. Assuming that the state of <code>Subject1</code> changes, <code>Subject1</code> calls <code>notify()</code> on itself. <code>notify()</code> calls <code>update()</code> on the registered <code>Observer1</code> and <code>Observer2</code>objects, which request the changed data (<code>getState()</code>) from <code>Subject1</code> to update (synchronize) their state.
</p>
<div class="mw-heading mw-heading3"><h3 id="UML_class_diagram">UML class diagram</h3></div>

<div class="mw-heading mw-heading2"><h2 id="Example">Example</h2></div>
<p>While the library classes <a rel="nofollow" class="external text" href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Observer.html"><code>java.util.Observer</code></a> and <a rel="nofollow" class="external text" href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Observable.html"><code>java.util.Observable</code></a> exist, they have been <a href="Deprecation" title="Deprecation">deprecated</a> in Java 9 because the model implemented was quite limited.
</p><p>Below is an example written in <a href="Java_(programming_language)" title="Java (programming language)">Java</a> that takes keyboard input and handles each input line as an event. When a string is supplied from <code>System.in</code>, the method <code>notifyObservers()</code> is then called in order to notify all observers of the event's occurrence, in the form of an invocation of their update methods.
</p>
<div class="mw-heading mw-heading3"><h3 id="Java">Java</h3></div>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.ArrayList</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.List</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Scanner</span><span class="p">;</span>

<span class="kd">interface</span> <span class="nc">Observer</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">update</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">event</span><span class="p">);</span>
<span class="p">}</span>
<span class="w"> </span>
<span class="kd">class</span> <span class="nc">EventSource</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Observer</span><span class="o">&gt;</span><span class="w"> </span><span class="n">observers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">();</span>
<span class="w"> </span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">notifyObservers</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">event</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">observers</span><span class="p">.</span><span class="na">forEach</span><span class="p">(</span><span class="n">observer</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">observer</span><span class="p">.</span><span class="na">update</span><span class="p">(</span><span class="n">event</span><span class="p">));</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">addObserver</span><span class="p">(</span><span class="n">Observer</span><span class="w"> </span><span class="n">observer</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">observers</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">observer</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">scanSystemIn</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Scanner</span><span class="w"> </span><span class="n">scanner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Scanner</span><span class="p">(</span><span class="n">System</span><span class="p">.</span><span class="na">in</span><span class="p">);</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">scanner</span><span class="p">.</span><span class="na">hasNextLine</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scanner</span><span class="p">.</span><span class="na">nextLine</span><span class="p">();</span>
<span class="w"> </span><span class="n">notifyObservers</span><span class="p">(</span><span class="n">line</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>

<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ObserverDemo</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">"Enter Text: "</span><span class="p">);</span>
<span class="w"> </span><span class="n">EventSource</span><span class="w"> </span><span class="n">eventSource</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">EventSource</span><span class="p">();</span>
<span class="w"> </span>
<span class="w"> </span><span class="n">eventSource</span><span class="p">.</span><span class="na">addObserver</span><span class="p">(</span><span class="n">event</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">"Received response: "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">event</span><span class="p">));</span>

<span class="w"> </span><span class="n">eventSource</span><span class="p">.</span><span class="na">scanSystemIn</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="C#">C#</h3></div>
<p>C# provides the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">IObservable</code>.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> and <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">IObserver</code><sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> interfaces as well as documentation on how to implement the design pattern.<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span class="k">class</span><span class="w"> </span><span class="nc">Payload</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">internal</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">Message</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">init</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Subject</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">IObservable</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">_observers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;&gt;</span><span class="p">();</span>

<span class="w"> </span><span class="n">IDisposable</span><span class="w"> </span><span class="n">IObservable</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Subscribe</span><span class="p">(</span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;</span><span class="w"> </span><span class="n">observer</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">_observers</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">observer</span><span class="p">))</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">_observers</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">observer</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">Unsubscriber</span><span class="p">(</span><span class="n">observer</span><span class="p">,</span><span class="w"> </span><span class="n">_observers</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="k">internal</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">SendMessage</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">message</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="kt">var</span><span class="w"> </span><span class="n">observer</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">_observers</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">observer</span><span class="p">.</span><span class="n">OnNext</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">Payload</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">message</span><span class="w"> </span><span class="p">});</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>

<span class="k">internal</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Unsubscriber</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">IDisposable</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;</span><span class="w"> </span><span class="n">_observer</span><span class="p">;</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">_observers</span><span class="p">;</span>

<span class="w"> </span><span class="k">internal</span><span class="w"> </span><span class="nf">Unsubscriber</span><span class="p">(</span>
<span class="w"> </span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;</span><span class="w"> </span><span class="n">observer</span><span class="p">,</span>
<span class="w"> </span><span class="n">ICollection</span><span class="o">&lt;</span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">observers</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">_observer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">observer</span><span class="p">;</span>
<span class="w"> </span><span class="n">_observers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">observers</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="n">IDisposable</span><span class="p">.</span><span class="n">Dispose</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">_observer</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">_observers</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">_observer</span><span class="p">))</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">_observers</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">_observer</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>

<span class="k">internal</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Observer</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">IObserver</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">_message</span><span class="p">;</span>

<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">OnCompleted</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">OnError</span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">error</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">OnNext</span><span class="p">(</span><span class="n">Payload</span><span class="w"> </span><span class="k">value</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">_message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">.</span><span class="n">Message</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="k">internal</span><span class="w"> </span><span class="n">IDisposable</span><span class="w"> </span><span class="nf">Register</span><span class="p">(</span><span class="n">IObservable</span><span class="o">&lt;</span><span class="n">Payload</span><span class="o">&gt;</span><span class="w"> </span><span class="n">subject</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">subject</span><span class="p">.</span><span class="n">Subscribe</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="C++">C++</h3></div>
<p>This is a C++11 implementation.
</p>
<div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;functional&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;list&gt;</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Subject</span><span class="p">;</span><span class="w"> </span><span class="c1">//Forward declaration for usage in Observer</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Observer</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="k">explicit</span><span class="w"> </span><span class="n">Observer</span><span class="p">(</span><span class="n">Subject</span><span class="o">&amp;</span><span class="w"> </span><span class="n">subj</span><span class="p">);</span>
<span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="o">~</span><span class="n">Observer</span><span class="p">();</span>
<span class="w"> </span>
<span class="w"> </span><span class="n">Observer</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">Observer</span><span class="o">&amp;</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">delete</span><span class="p">;</span><span class="w"> </span><span class="c1">// rule of three</span>
<span class="w"> </span><span class="n">Observer</span><span class="o">&amp;</span><span class="w"> </span><span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">Observer</span><span class="o">&amp;</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">delete</span><span class="p">;</span>

<span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">update</span><span class="p">(</span><span class="w"> </span><span class="n">Subject</span><span class="o">&amp;</span><span class="w"> </span><span class="n">s</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="k">private</span><span class="o">:</span>
<span class="w"> </span><span class="c1">// Reference to a Subject object to detach in the destructor</span>
<span class="w"> </span><span class="n">Subject</span><span class="o">&amp;</span><span class="w"> </span><span class="n">subject</span><span class="p">;</span>
<span class="p">};</span>

<span class="c1">// Subject is the base class for event generation</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Subject</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">RefObserver</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">reference_wrapper</span><span class="o">&lt;</span><span class="k">const</span><span class="w"> </span><span class="n">Observer</span><span class="o">&gt;</span><span class="p">;</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Notify all the attached observers</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">notify</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">auto</span><span class="o">&amp;</span><span class="w"> </span><span class="n">x</span><span class="o">:</span><span class="w"> </span><span class="n">observers</span><span class="p">)</span><span class="w"> </span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">get</span><span class="p">().</span><span class="n">update</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Add an observer</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">attach</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">Observer</span><span class="o">&amp;</span><span class="w"> </span><span class="n">observer</span><span class="p">)</span><span class="w"> </span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">observers</span><span class="p">.</span><span class="n">push_front</span><span class="p">(</span><span class="n">observer</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Remove an observer</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">detach</span><span class="p">(</span><span class="n">Observer</span><span class="o">&amp;</span><span class="w"> </span><span class="n">observer</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">observers</span><span class="p">.</span><span class="n">remove_if</span><span class="p">(</span><span class="w"> </span><span class="p">[</span><span class="o">&amp;</span><span class="n">observer</span><span class="w"> </span><span class="p">](</span><span class="k">const</span><span class="w"> </span><span class="n">RefObserver</span><span class="o">&amp;</span><span class="w"> </span><span class="n">obj</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&amp;</span><span class="n">obj</span><span class="p">.</span><span class="n">get</span><span class="p">()</span><span class="o">==&amp;</span><span class="n">observer</span><span class="p">;</span><span class="w"> </span>
<span class="w"> </span><span class="p">});</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="k">private</span><span class="o">:</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">list</span><span class="o">&lt;</span><span class="n">RefObserver</span><span class="o">&gt;</span><span class="w"> </span><span class="n">observers</span><span class="p">;</span>
<span class="p">};</span>

<span class="n">Observer</span><span class="o">::</span><span class="n">Observer</span><span class="p">(</span><span class="n">Subject</span><span class="o">&amp;</span><span class="w"> </span><span class="n">subj</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">subject</span><span class="p">(</span><span class="n">subj</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">subject</span><span class="p">.</span><span class="n">attach</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">Observer</span><span class="o">::~</span><span class="n">Observer</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">subject</span><span class="p">.</span><span class="n">detach</span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
<span class="p">}</span>


<span class="c1">// Example of usage</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ConcreteObserver</span><span class="o">:</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Observer</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="n">ConcreteObserver</span><span class="p">(</span><span class="n">Subject</span><span class="o">&amp;</span><span class="w"> </span><span class="n">subj</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Observer</span><span class="p">(</span><span class="n">subj</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Get notification</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">update</span><span class="p">(</span><span class="n">Subject</span><span class="o">&amp;</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">override</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">"Got a notification"</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span>
<span class="p">{</span>
<span class="w"> </span><span class="n">Subject</span><span class="w"> </span><span class="n">cs</span><span class="p">;</span>
<span class="w"> </span><span class="n">ConcreteObserver</span><span class="w"> </span><span class="n">co1</span><span class="p">(</span><span class="n">cs</span><span class="p">);</span>
<span class="w"> </span><span class="n">ConcreteObserver</span><span class="w"> </span><span class="n">co2</span><span class="p">(</span><span class="n">cs</span><span class="p">);</span>
<span class="w"> </span><span class="n">cs</span><span class="p">.</span><span class="n">notify</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
<p>The program output is like
</p>
<div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span class="n">Got</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">notification</span>
<span class="n">Got</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">notification</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Groovy">Groovy</h3></div>
<div class="mw-highlight mw-highlight-lang-groovy mw-content-ltr" dir="ltr"><pre><span class="kd">class</span><span class="w"> </span><span class="nc">EventSource</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">observers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[]</span>

<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="nf">notifyObservers</span><span class="o">(</span><span class="n">String</span><span class="w"> </span><span class="n">event</span><span class="o">)</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="n">observers</span><span class="o">.</span><span class="na">each</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">it</span><span class="o">(</span><span class="n">event</span><span class="o">)</span><span class="w"> </span><span class="o">}</span>
<span class="w"> </span><span class="o">}</span>

<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">addObserver</span><span class="o">(</span><span class="n">observer</span><span class="o">)</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="n">observers</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">observer</span>
<span class="w"> </span><span class="o">}</span>

<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">scanSystemIn</span><span class="o">()</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="n">var</span><span class="w"> </span><span class="n">scanner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Scanner</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">in</span><span class="o">)</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="o">(</span><span class="n">scanner</span><span class="o">)</span><span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="n">var</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scanner</span><span class="o">.</span><span class="na">nextLine</span><span class="o">()</span>
<span class="w"> </span><span class="n">notifyObservers</span><span class="o">(</span><span class="n">line</span><span class="o">)</span>
<span class="w"> </span><span class="o">}</span>
<span class="w"> </span><span class="o">}</span>
<span class="o">}</span>

<span class="n">println</span><span class="w"> </span><span class="s1">'Enter Text: '</span>
<span class="n">var</span><span class="w"> </span><span class="n">eventSource</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">EventSource</span><span class="o">()</span>

<span class="n">eventSource</span><span class="o">.</span><span class="na">addObserver</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">event</span><span class="w"> </span><span class="o">-&gt;</span>
<span class="w"> </span><span class="n">println</span><span class="w"> </span><span class="s2">"Received response: $event"</span>
<span class="o">}</span>

<span class="n">eventSource</span><span class="o">.</span><span class="na">scanSystemIn</span><span class="o">()</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Kotlin">Kotlin</h3></div>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="k">import</span><span class="w"> </span><span class="nn">java.util.Scanner</span>

<span class="k">typealias</span><span class="w"> </span><span class="n">Observer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">event</span><span class="p">:</span><span class="w"> </span><span class="kt">String</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="kt">Unit</span><span class="p">;</span>

<span class="kd">class</span><span class="w"> </span><span class="nc">EventSource</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">observers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mutableListOf</span><span class="o">&lt;</span><span class="n">Observer</span><span class="o">&gt;</span><span class="p">()</span>

<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">notifyObservers</span><span class="p">(</span><span class="n">event</span><span class="p">:</span><span class="w"> </span><span class="kt">String</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">observers</span><span class="p">.</span><span class="na">forEach</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">it</span><span class="p">(</span><span class="n">event</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">addObserver</span><span class="p">(</span><span class="n">observer</span><span class="p">:</span><span class="w"> </span><span class="n">Observer</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">observers</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">observer</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">scanSystemIn</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">scanner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Scanner</span><span class="p">(</span><span class="n">System</span><span class="p">.</span><span class="n">`in`</span><span class="p">)</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">scanner</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scanner</span><span class="p">.</span><span class="na">nextLine</span><span class="p">()</span>
<span class="w"> </span><span class="n">notifyObservers</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="kd">fun</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">arg</span><span class="p">:</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="kt">String</span><span class="o">&gt;</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Enter Text: "</span><span class="p">)</span>
<span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">eventSource</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">EventSource</span><span class="p">()</span>

<span class="w"> </span><span class="n">eventSource</span><span class="p">.</span><span class="na">addObserver</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">event</span><span class="w"> </span><span class="o">-&gt;</span>
<span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Received response: </span><span class="si">$</span><span class="n">event</span><span class="s">"</span><span class="p">)</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="n">eventSource</span><span class="p">.</span><span class="na">scanSystemIn</span><span class="p">()</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Delphi">Delphi</h3></div>
<div class="mw-highlight mw-highlight-lang-delphi mw-content-ltr" dir="ltr"><pre><span class="k">uses</span>
<span class="w"> </span><span class="n">System</span><span class="o">.</span><span class="n">Generics</span><span class="o">.</span><span class="n">Collections</span><span class="o">,</span><span class="w"> </span><span class="n">System</span><span class="o">.</span><span class="n">SysUtils</span><span class="o">;</span>

<span class="k">type</span>
<span class="w"> </span><span class="n">IObserver</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">interface</span>
<span class="w"> </span><span class="p">[</span><span class="s">'{0C8F4C5D-1898-4F24-91DA-63F1DD66A692}'</span><span class="p">]</span>
<span class="w"> </span><span class="k">procedure</span><span class="w"> </span><span class="nf">Update</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AValue</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">end</span><span class="o">;</span>

<span class="k">type</span>
<span class="w"> </span><span class="n">TObserverManager</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">class</span>
<span class="w"> </span><span class="kp">private</span>
<span class="w"> </span><span class="n">FObservers</span><span class="o">:</span><span class="w"> </span><span class="n">TList</span><span class="o">&lt;</span><span class="n">IObserver</span><span class="o">&gt;;</span>
<span class="w"> </span><span class="kp">public</span>
<span class="w"> </span><span class="k">constructor</span><span class="w"> </span><span class="nf">Create</span><span class="o">;</span><span class="w"> </span><span class="n">overload</span><span class="o">;</span>
<span class="w"> </span><span class="k">destructor</span><span class="w"> </span><span class="nf">Destroy</span><span class="o">;</span><span class="w"> </span><span class="kp">override</span><span class="o">;</span>
<span class="w"> </span><span class="k">procedure</span><span class="w"> </span><span class="nf">NotifyObservers</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AValue</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">procedure</span><span class="w"> </span><span class="nf">AddObserver</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AObserver</span><span class="o">:</span><span class="w"> </span><span class="n">IObserver</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">procedure</span><span class="w"> </span><span class="nf">UnregisterObsrver</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AObserver</span><span class="o">:</span><span class="w"> </span><span class="n">IObserver</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">end</span><span class="o">;</span>

<span class="k">type</span>
<span class="w"> </span><span class="n">TListener</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">class</span><span class="p">(</span><span class="n">TInterfacedObject</span><span class="o">,</span><span class="w"> </span><span class="n">IObserver</span><span class="p">)</span>
<span class="w"> </span><span class="kp">private</span>
<span class="w"> </span><span class="n">FName</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="o">;</span>
<span class="w"> </span><span class="kp">public</span>
<span class="w"> </span><span class="k">constructor</span><span class="w"> </span><span class="nf">Create</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AName</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="p">)</span><span class="o">;</span><span class="w"> </span><span class="k">reintroduce</span><span class="o">;</span>
<span class="w"> </span><span class="k">procedure</span><span class="w"> </span><span class="nf">Update</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AValue</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">end</span><span class="o">;</span>

<span class="k">procedure</span><span class="w"> </span><span class="nc">TObserverManager</span><span class="o">.</span><span class="nf">AddObserver</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AObserver</span><span class="o">:</span><span class="w"> </span><span class="n">IObserver</span><span class="p">)</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="n">FObservers</span><span class="o">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">AObserver</span><span class="p">)</span>
<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">FObservers</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="n">AObserver</span><span class="p">)</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>

<span class="k">begin</span>
<span class="w"> </span><span class="nb">FreeAndNil</span><span class="p">(</span><span class="n">FObservers</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">inherited</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>

<span class="k">procedure</span><span class="w"> </span><span class="nc">TObserverManager</span><span class="o">.</span><span class="nf">NotifyObservers</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AValue</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="p">)</span><span class="o">;</span>
<span class="k">var</span>
<span class="w"> </span><span class="n">i</span><span class="o">:</span><span class="w"> </span><span class="kt">Integer</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">FObservers</span><span class="o">.</span><span class="n">Count</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="n">FObservers</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">Update</span><span class="p">(</span><span class="n">AValue</span><span class="p">)</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>

<span class="k">procedure</span><span class="w"> </span><span class="nc">TObserverManager</span><span class="o">.</span><span class="nf">UnregisterObsrver</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AObserver</span><span class="o">:</span><span class="w"> </span><span class="n">IObserver</span><span class="p">)</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">FObservers</span><span class="o">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">AObserver</span><span class="p">)</span>
<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">FObservers</span><span class="o">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">AObserver</span><span class="p">)</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>

<span class="k">constructor</span><span class="w"> </span><span class="nc">TListener</span><span class="o">.</span><span class="nf">Create</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AName</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="p">)</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="k">inherited</span><span class="w"> </span><span class="n">Create</span><span class="o">;</span>
<span class="w"> </span><span class="n">FName</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">AName</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>

<span class="k">procedure</span><span class="w"> </span><span class="nc">TListener</span><span class="o">.</span><span class="nf">Update</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">AValue</span><span class="o">:</span><span class="w"> </span><span class="k">string</span><span class="p">)</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="nb">WriteLn</span><span class="p">(</span><span class="n">FName</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">' listener received notification: '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">AValue</span><span class="p">)</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>

<span class="k">procedure</span><span class="w"> </span><span class="nc">TMyForm</span><span class="o">.</span><span class="nf">ObserverExampleButtonClick</span><span class="p">(</span><span class="n">Sender</span><span class="o">:</span><span class="w"> </span><span class="kt">TObject</span><span class="p">)</span><span class="o">;</span>
<span class="k">var</span>
<span class="w"> </span><span class="n">LDoorNotify</span><span class="o">:</span><span class="w"> </span><span class="n">TObserverManager</span><span class="o">;</span>
<span class="w"> </span><span class="n">LListenerHusband</span><span class="o">:</span><span class="w"> </span><span class="n">IObserver</span><span class="o">;</span>
<span class="w"> </span><span class="n">LListenerWife</span><span class="o">:</span><span class="w"> </span><span class="n">IObserver</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="n">LDoorNotify</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">TObserverManager</span><span class="o">.</span><span class="n">Create</span><span class="o">;</span>
<span class="w"> </span><span class="k">try</span>
<span class="w"> </span><span class="n">LListenerHusband</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">TListener</span><span class="o">.</span><span class="n">Create</span><span class="p">(</span><span class="s">'Husband'</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="n">LDoorNotify</span><span class="o">.</span><span class="n">AddObserver</span><span class="p">(</span><span class="n">LListenerHusband</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="n">LListenerWife</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">TListener</span><span class="o">.</span><span class="n">Create</span><span class="p">(</span><span class="s">'Wife'</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="n">LDoorNotify</span><span class="o">.</span><span class="n">AddObserver</span><span class="p">(</span><span class="n">LListenerWife</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="n">LDoorNotify</span><span class="o">.</span><span class="n">NotifyObservers</span><span class="p">(</span><span class="s">'Someone is knocking on the door'</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">finally</span>
<span class="w"> </span><span class="nb">FreeAndNil</span><span class="p">(</span><span class="n">LDoorNotify</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="k">end</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>
</pre></div>
<p>Output
</p>
<pre>Husband listener received notification: Someone is knocking on the door
Wife listener received notification: Someone is knocking on the door
</pre>
<div class="mw-heading mw-heading3"><h3 id="Python">Python</h3></div>
<p>A similar example in <a href="Python_(programming_language)" title="Python (programming language)">Python</a>:
</p>
<div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span class="k">class</span><span class="w"> </span><span class="nc">Observable</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_observers</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">def</span><span class="w"> </span><span class="nf">register_observer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">observer</span><span class="p">:</span> <span class="n">Observer</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_observers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">observer</span><span class="p">)</span>

<span class="k">def</span><span class="w"> </span><span class="nf">notify_observers</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">for</span> <span class="n">observer</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_observers</span><span class="p">:</span>
<span class="n">observer</span><span class="o">.</span><span class="n">notify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>


<span class="k">class</span><span class="w"> </span><span class="nc">Observer</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">observable</span><span class="p">:</span> <span class="n">Observable</span><span class="p">):</span>
<span class="n">observable</span><span class="o">.</span><span class="n">register_observer</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

<span class="k">def</span><span class="w"> </span><span class="nf">notify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">observable</span><span class="p">:</span> <span class="n">Observable</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Got"</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> <span class="s2">"From"</span><span class="p">,</span> <span class="n">observable</span><span class="p">)</span>


<span class="n">subject</span> <span class="o">=</span> <span class="n">Observable</span><span class="p">()</span>
<span class="n">observer</span> <span class="o">=</span> <span class="n">Observer</span><span class="p">(</span><span class="n">subject</span><span class="p">)</span>
<span class="n">subject</span><span class="o">.</span><span class="n">notify_observers</span><span class="p">(</span><span class="s2">"test"</span><span class="p">,</span> <span class="n">kw</span><span class="o">=</span><span class="s2">"python"</span><span class="p">)</span>

<span class="c1"># prints: Got ('test',) {'kw': 'python'} From &lt;__main__.Observable object at 0x0000019757826FD0&gt;</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="JavaScript">JavaScript</h3></div>
<p>JavaScript has a deprecated <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">Object.observe</code> function that was a more accurate implementation of the observer pattern.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> This would fire events upon change to the observed object. Without the deprecated <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">Object.observe</code> function, the pattern may be implemented with more explicit code:<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span class="kd">let</span><span class="w"> </span><span class="nx">Subject</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">_state</span><span class="o">:</span><span class="w"> </span><span class="mf">0</span><span class="p">,</span>
<span class="w"> </span><span class="nx">_observers</span><span class="o">:</span><span class="w"> </span><span class="p">[],</span>
<span class="w"> </span><span class="nx">add</span><span class="o">:</span><span class="w"> </span><span class="kd">function</span><span class="p">(</span><span class="nx">observer</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">_observers</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">observer</span><span class="p">);</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nx">getState</span><span class="o">:</span><span class="w"> </span><span class="kd">function</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">_state</span><span class="p">;</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nx">setState</span><span class="o">:</span><span class="w"> </span><span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">_state</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">value</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">_observers</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">_observers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">signal</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">};</span>

<span class="kd">let</span><span class="w"> </span><span class="nx">Observer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">signal</span><span class="o">:</span><span class="w"> </span><span class="kd">function</span><span class="p">(</span><span class="nx">subject</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">currentValue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">subject</span><span class="p">.</span><span class="nx">getState</span><span class="p">();</span>
<span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">currentValue</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>

<span class="nx">Subject</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">Observer</span><span class="p">);</span>
<span class="nx">Subject</span><span class="p">.</span><span class="nx">setState</span><span class="p">(</span><span class="mf">10</span><span class="p">);</span>
<span class="c1">// Output in console.log - 10</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Implicit_invocation" title="Implicit invocation">Implicit invocation</a></li>
<li><a href="Client%E2%80%93server_model" title="Client–server model">Client–server model</a></li>
<li>The observer pattern is often used in the <a href="Entity%E2%80%93component%E2%80%93system" class="mw-redirect" title="Entity–component–system">entity–component–system</a> pattern</li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-GoF-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-GoF_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-GoF_1-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFErich_GammaRichard_HelmRalph_JohnsonJohn_Vlissides1994" class="citation book cs1">Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides (1994). <span class="id-lock-registration" title="Free registration required"><a rel="nofollow" class="external text" href="https://archive.org/details/designpatternsel00gamm/page/293"><i>Design Patterns: Elements of Reusable Object-Oriented Software</i></a></span>. Addison Wesley. pp.&nbsp;<a rel="nofollow" class="external text" href="https://archive.org/details/designpatternsel00gamm/page/293">293ff</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>0-201-63361-2</bdi>.</cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.geeksforgeeks.org/observer-pattern-set-1-introduction/">"Observer Design Pattern"</a>. <i>www.geeksforgeeks.org</i>.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://github.com/millermedeiros/js-signals/wiki/Comparison-between-different-Observer-Pattern-implementations">Comparison between different observer pattern implementations</a> — Moshe Bindler, 2015 (GitHub)</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.safaribooksonline.com/library/view/learning-javascript-design/9781449334840/ch09s05.html">Differences between pub/sub and observer pattern</a> — <i>The Observer Pattern</i> by Adi Osmani (Safari Books Online)</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://books.google.com/books?id=18wFKrkDdM0C&amp;pg=PA230">The Windows Programming Experience</a>, <a href="Charles_Petzold" title="Charles Petzold">Charles Petzold</a>, November 10, 1992, <i>PC Magazine</i> (<a href="Google_Books" title="Google Books">Google Books</a>)</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://w3sdesign.com/?gr=b07&amp;ugr=struct">"The Observer design pattern - Structure and Collaboration"</a>. <i>w3sDesign.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2017-08-12</span></span>.</cite></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://learn.microsoft.com/en-us/dotnet/api/system.iobservable-1?view=net-8.0">"IObservable Interface (System)"</a>. <i>learn.microsoft.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">9 November</span> 2024</span>.</cite></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://learn.microsoft.com/en-us/dotnet/api/system.iobserver-1?view=net-8.0">"IObserver Interface (System)"</a>. <i>learn.microsoft.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">9 November</span> 2024</span>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://learn.microsoft.com/en-us/dotnet/standard/events/observer-design-pattern">"Observer design pattern - .NET"</a>. <i>learn.microsoft.com</i>. 25 May 2023<span class="reference-accessdate">. Retrieved <span class="nowrap">9 November</span> 2024</span>.</cite></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://stackoverflow.com/a/50862441/887092">"jQuery - Listening for variable changes in JavaScript"</a>.</cite></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://stackoverflow.com/a/37403125/887092">"Jquery - Listening for variable changes in JavaScript"</a>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><span class="noviewer" typeof="mw:File"></span> <a href="https://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Observer" class="extiw external" title="wikibooks:Computer Science Design Patterns/Observer">Observer implementations in various languages</a> at Wikibooks</li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}


/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Software_design_patterns225" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div id="Software_design_patterns225" style="font-size:114%;margin:0 4em"><a href="Software_design_pattern" title="Software design pattern">Software design patterns</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Design_Patterns" title="Design Patterns">Gang of Four<br>patterns</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Creational_pattern" title="Creational pattern">Creational</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Abstract_factory_pattern" title="Abstract factory pattern">Abstract factory</a></li>
<li><a href="Builder_pattern" title="Builder pattern">Builder</a></li>
<li><a href="Factory_method_pattern" title="Factory method pattern">Factory method</a></li>
<li><a href="Prototype_pattern" title="Prototype pattern">Prototype</a></li>
<li><a href="Singleton_pattern" title="Singleton pattern">Singleton</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Structural_pattern" title="Structural pattern">Structural</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Adapter_pattern" title="Adapter pattern">Adapter</a></li>
<li><a href="Bridge_pattern" title="Bridge pattern">Bridge</a></li>
<li><a href="Composite_pattern" title="Composite pattern">Composite</a></li>
<li><a href="Decorator_pattern" title="Decorator pattern">Decorator</a></li>
<li><a href="Facade_pattern" title="Facade pattern">Facade</a></li>
<li><a href="Flyweight_pattern" title="Flyweight pattern">Flyweight</a></li>
<li><a href="Proxy_pattern" title="Proxy pattern">Proxy</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Behavioral_pattern" title="Behavioral pattern">Behavioral</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Chain-of-responsibility_pattern" title="Chain-of-responsibility pattern">Chain of responsibility</a></li>
<li><a href="Command_pattern" title="Command pattern">Command</a></li>
<li><a href="Interpreter_pattern" title="Interpreter pattern">Interpreter</a></li>
<li><a href="Iterator_pattern" title="Iterator pattern">Iterator</a></li>
<li><a href="Mediator_pattern" title="Mediator pattern">Mediator</a></li>
<li><a href="Memento_pattern" title="Memento pattern">Memento</a></li>

<li><a href="State_pattern" title="State pattern">State</a></li>
<li><a href="Strategy_pattern" title="Strategy pattern">Strategy</a></li>
<li><a href="Template_method_pattern" title="Template method pattern">Template method</a></li>
<li><a href="Visitor_pattern" title="Visitor pattern">Visitor</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Concurrency_pattern" title="Concurrency pattern">Concurrency<br>patterns</a></th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Active_object" title="Active object">Active object</a></li>
<li><a href="Balking_pattern" title="Balking pattern">Balking</a></li>
<li><a href="Binding_properties_pattern" title="Binding properties pattern">Binding properties</a></li>
<li><a href="Double-checked_locking" title="Double-checked locking">Double-checked locking</a></li>
<li><a href="Asynchronous_method_invocation" title="Asynchronous method invocation">Event-based asynchronous</a></li>
<li><a href="Guarded_suspension" title="Guarded suspension">Guarded suspension</a></li>
<li><a href="Join-pattern" title="Join-pattern">Join</a></li>
<li><a href="Lock_(computer_science)" title="Lock (computer science)">Lock</a></li>
<li><a href="Monitor_(synchronization)" title="Monitor (synchronization)">Monitor</a></li>
<li><a href="Proactor_pattern" title="Proactor pattern">Proactor</a></li>
<li><a href="Reactor_pattern" title="Reactor pattern">Reactor</a></li>
<li><a href="Readers%E2%80%93writer_lock" title="Readers–writer lock">Read–write lock</a></li>
<li><a href="Scheduler_pattern" class="mw-redirect" title="Scheduler pattern">Scheduler</a></li>
<li><a href="Scheduled-task_pattern" title="Scheduled-task pattern">Scheduled-task pattern</a></li>
<li><a href="Semaphore_(programming)" title="Semaphore (programming)">Semaphore</a></li>
<li><a href="Thread_pool" title="Thread pool">Thread pool</a></li>
<li><a href="Thread-local_storage" title="Thread-local storage">Thread-local storage</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Architectural_pattern" title="Architectural pattern">Architectural<br>patterns</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Front_controller" title="Front controller">Front controller</a></li>
<li><a href="Interceptor_pattern" title="Interceptor pattern">Interceptor</a></li>
<li><a href="Model%E2%80%93view%E2%80%93controller" title="Model–view–controller">MVC</a>
<ul><li><a href="Model%E2%80%93view%E2%80%93presenter" title="Model–view–presenter">MVP</a></li>
<li><a href="Model%E2%80%93view%E2%80%93viewmodel" title="Model–view–viewmodel">MVVM</a></li></ul></li>
<li><a href="Action%E2%80%93domain%E2%80%93responder" title="Action–domain–responder">ADR</a></li>
<li><a href="Entity_component_system" title="Entity component system">ECS</a></li>
<li><a href="Multitier_architecture" title="Multitier architecture"><i>n</i>-tier</a></li>
<li><a href="Specification_pattern" title="Specification pattern">Specification</a></li>
<li><a href="Publish%E2%80%93subscribe_pattern" title="Publish–subscribe pattern">Publish–subscribe</a></li>
<li><a href="Naked_objects" title="Naked objects">Naked objects</a></li>
<li><a href="Service_locator_pattern" title="Service locator pattern">Service locator</a></li>
<li><a href="Active_record_pattern" title="Active record pattern">Active record</a></li>
<li><a href="Identity_map_pattern" title="Identity map pattern">Identity map</a></li>
<li><a href="Data_access_object" title="Data access object">Data access object</a></li>
<li><a href="Data_transfer_object" title="Data transfer object">Data transfer object</a></li>
<li><a href="Inversion_of_control" title="Inversion of control">Inversion of control</a></li>
<li><a href="JSP_model_2_architecture" title="JSP model 2 architecture">Model 2</a></li>
<li><a href="Broker_pattern" title="Broker pattern">Broker</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Other<br>patterns</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Blackboard_design_pattern" class="mw-redirect" title="Blackboard design pattern">Blackboard</a></li>
<li><a href="Business_delegate_pattern" title="Business delegate pattern">Business delegate</a></li>
<li><a href="Composite_entity_pattern" title="Composite entity pattern">Composite entity</a></li>
<li><a href="Dependency_injection" title="Dependency injection">Dependency injection</a></li>
<li><a href="Guard_(computer_science)" title="Guard (computer science)">Guard clause</a></li>
<li><a href="Intercepting_filter_pattern" title="Intercepting filter pattern">Intercepting filter</a></li>
<li><a href="Lazy_loading" title="Lazy loading">Lazy loading</a></li>
<li><a href="Mock_object" title="Mock object">Mock object</a></li>
<li><a href="Null_object_pattern" title="Null object pattern">Null object</a></li>
<li><a href="Object_pool_pattern" title="Object pool pattern">Object pool</a></li>
<li><a href="Servant_(design_pattern)" title="Servant (design pattern)">Servant</a></li>
<li><a href="Twin_pattern" title="Twin pattern">Twin</a></li>
<li><a href="Type_Tunnel_pattern" class="mw-redirect" title="Type Tunnel pattern">Type tunnel</a></li>
<li><a href="Method_chaining" title="Method chaining">Method chaining</a></li>
<li><a href="Delegation_pattern" title="Delegation pattern">Delegation</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Books</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><i><a href="Design_Patterns" title="Design Patterns">Design Patterns</a></i></li>
<li><i><a href="Enterprise_Integration_Patterns" title="Enterprise Integration Patterns">Enterprise Integration Patterns</a></i></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">People</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Christopher_Alexander" title="Christopher Alexander">Christopher Alexander</a></li>
<li><a href="Erich_Gamma" title="Erich Gamma">Erich Gamma</a></li>
<li><a href="Ralph_Johnson_(computer_scientist)" title="Ralph Johnson (computer scientist)">Ralph Johnson</a></li>
<li><a href="John_Vlissides" title="John Vlissides">John Vlissides</a></li>
<li><a href="Grady_Booch" title="Grady Booch">Grady Booch</a></li>
<li><a href="Kent_Beck" title="Kent Beck">Kent Beck</a></li>
<li><a href="Ward_Cunningham" title="Ward Cunningham">Ward Cunningham</a></li>
<li><a href="Martin_Fowler_(software_engineer)" title="Martin Fowler (software engineer)">Martin Fowler</a></li>
<li><a href="Robert_C._Martin" title="Robert C. Martin">Robert Martin</a></li>
<li><a href="Jim_Coplien" title="Jim Coplien">Jim Coplien</a></li>
<li><a href="Douglas_C._Schmidt" title="Douglas C. Schmidt">Douglas Schmidt</a></li>
<li><a href="Linda_Rising" title="Linda Rising">Linda Rising</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Communities</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="The_Hillside_Group" title="The Hillside Group">The Hillside Group</a></li>
<li><a href="Portland_Pattern_Repository" title="Portland Pattern Repository">Portland Pattern Repository</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">See also</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Anti-pattern" title="Anti-pattern">Anti-pattern</a></li>
<li><a href="Architectural_pattern" title="Architectural pattern">Architectural pattern</a></li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-07-27" href="https://en.wikipedia.org/wiki/?title=Observer_pattern&amp;oldid=1302725231">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>